﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ModeloGaleriaNET.VendedorArteCommands;
using System.Windows.Controls;
using System.Xml.Schema;
using System.Threading;
using ModeloGaleriaNET.Police;
using Newtonsoft.Json;

namespace ModeloGaleriaNET
{
    public class CancelarSubastaMessage: IMessageType
    {
        private VendedorArteCommands.VendedorArteCommands vendedor;
        private Subasta subasta;
        private VendedorArteCommands.AuthInfo auth;
        private string lastEstado;
        private AvalonDock.DockableContent doc;
        private int usuarioId;
        private GandalfService policia;

        public CancelarSubastaMessage(Subasta s, AvalonDock.DockableContent d, int uId)
        {
            policia = new GandalfService();
            doc = d;
            subasta = s;
            lastEstado = string.Copy(s.EstadoActual.Estado);
            vendedor = new VendedorArteCommands.VendedorArteCommands();
            vendedor.Timeout = (int)ServerConnData.Instance.TimeOut*1000;
            auth = new AuthInfo();
            auth.pseudonimo = ServerConnData.Instance.User;
            auth.password = Utilities.EncriptarMD5(ServerConnData.Instance.Password);
            this.usuarioId = uId;
        }

        public Subasta Subasta
        {
            get { return subasta; }
        }

        public string LastEstado
        {
            get { return lastEstado; }
        }

        public int UsuarioId
        {
            get { return usuarioId; }
        }

        public int Execute()
        {
            authInfo authPolice;
            getTicketResponse ticketResponse;
            AESCripto aes;
            dynamic objeto;
            string json;
            byte[] encriptado;
            ModeloGaleriaNET.VendedorArteCommands_Safe.VendedorArteCommandsService vendedorSafe;
            ModeloGaleriaNET.VendedorArteCommands_Safe.ticketEncryptedRequest request;

            if (ModeloGaleriaNET.Properties.Settings.Default.Seguridad == 2 || ModeloGaleriaNET.Properties.Settings.Default.Seguridad == 3)
            //if (ModeloGaleriaNET.Properties.Settings.Default.Seguridad == 4)
            {
                objeto = new { referencia = Convert.ToInt64(subasta.ReferenciaExterna) };
                json = JsonConvert.SerializeObject(objeto);

                policia.Url = ModeloGaleriaNET.Properties.Settings.Default.Seguridad == 2 ?
                   ModeloGaleriaNET.Properties.Settings.Default.ModeloGaleriaNET_Police_GandalfService :
                   ModeloGaleriaNET.Properties.Settings.Default.ModeloGaleriaNET_Police_GandalfService_SSL;
                policia.Timeout = (int)ModeloGaleriaNET.Properties.Settings.Default.TimeOut * 1000;
                authPolice = new authInfo();
                authPolice.pseudonimo = ServerConnData.Instance.User;
                authPolice.password = Utilities.EncriptarMD5(ServerConnData.Instance.Password);
                ticketResponse = policia.getTicket(authPolice);

                // Crear mensaje encriptado con el JSON y enviar
                aes = new AESCripto(ticketResponse.secretKey);
                encriptado = aes.EncryptStringToBytes(json);

                vendedorSafe = new VendedorArteCommands_Safe.VendedorArteCommandsService();
                vendedorSafe.Url = ModeloGaleriaNET.Properties.Settings.Default.Seguridad == 2 ?
                    ModeloGaleriaNET.Properties.Settings.Default.ModeloGaleriaNET_VendedorArteCommands_Safe_VendedorArteCommandsService :
                    ModeloGaleriaNET.Properties.Settings.Default.ModeloGaleriaNET_VendedorArteCommands_Safe_VendedorArteCommandsService_SSL;
                vendedorSafe.Timeout = (int)ModeloGaleriaNET.Properties.Settings.Default.TimeOut * 1000;
                request = new VendedorArteCommands_Safe.ticketEncryptedRequest();
                request.message = encriptado;
                request.ticketId = ticketResponse.ticketId;
                vendedorSafe.cancelarSubastaEncrypted(request);
            }
            else
            {
                vendedor.Url = Properties.Settings.Default.Seguridad == 0 ?
                    Properties.Settings.Default.ModeloGaleriaNET_VendedorArteCommands_VendedorArteCommands :
                    Properties.Settings.Default.ModeloGaleriaNET_VendedorArteCommands_VendedorArteCommands_SSL;
                vendedor.cancelar(auth, Convert.ToInt64(subasta.ReferenciaExterna), true);
            }
            return -1;
        }

        public void printInitialMessage()
        {
            Utilities.WriteMessageOnGrid(doc, "[Local]\tCancelando la subasta con referencia local " + subasta.Id + "...",
                DataGridMessage.TIPO_MENSAJE.INFO);
        }

        public void printErrorMessage() 
        {
            Utilities.WriteMessageOnGrid(doc, "[Local]\tHa ocurrido un error al cancelar la subasta con referencia local " + subasta.Id,
                DataGridMessage.TIPO_MENSAJE.WARNING);
        }

        public void printLastErrorMessage() 
        {
            Utilities.WriteMessageOnGrid(doc, "[Local]\tNo se ha podido cancelar la subasta con referencia "
                    + subasta.Id + " después de 3 intentos. Se han desecho los cambios en local", DataGridMessage.TIPO_MENSAJE.ERROR);
        }

        public void printSuccessMessage() 
        {
            Utilities.WriteMessageOnGrid(doc, "[Local]\tLa subasta con referencia " + subasta.Id + " se ha cancelado con éxito",
                DataGridMessage.TIPO_MENSAJE.INFO);
        }
    }
}
